Les modifications de données arrivent rarement seules : un virement doit débiter un compte et créditer un autre, et une commande doit réserver du stock et enregistrer un paiement. Si le système s'arrête à mi-chemin, la base de données décrit alors un monde qui n'a jamais existé. Une transaction est la réponse de la base de données à ce problème — une séquence d'une ou plusieurs opérations que la base de données traite comme une unité de travail unique et indivisible.
Tout, ou rien
Au sein d'une transaction, chaque opération appartient à un même résultat. La base de données n'expose jamais un état final dans lequel seule une partie de la transaction a eu lieu. L'illustration classique est un virement entre deux comptes bancaires : réduire le solde du compte source, puis augmenter le solde du compte destinataire. Si seule la première étape réussissait, l'argent disparaîtrait ; si seule la seconde, l'argent apparaîtrait de nulle part. Regrouper les deux étapes dans une seule transaction élimine ces deux possibilités.
Cette garantie du tout ou rien est appelée atomicité. Valider est l'acte qui rend permanentes les modifications de la transaction ; une transaction jamais validée ne laisse aucune trace. Durabilité apporte la pièce finale : une fois la validation effectuée, la modification survit même si la machine perd l'alimentation un instant plus tard.
Une transaction est une frontière
Il est utile de se représenter une transaction comme une frontière tracée autour d'un groupe d'instructions. Avant et après cette frontière, les données satisfont les règles imposées par la structure. À l'intérieur de la frontière, des états intermédiaires existent — un compte est déjà débité alors que l'autre n'est pas encore crédité — mais ces états sont propres à la transaction. Les instructions ultérieures des autres sessions ne les considèrent pas comme la vérité.
Deux rôles à la fois
Les transactions remplissent donc deux rôles. Le premier est la gestion des défaillances: si le processus plante, si la connexion est interrompue ou si une instruction génère une erreur, la base de données peut restaurer l'état qui existait avant le début de la transaction. Le second est le contrôle de la visibilité: pendant que le travail est en cours, les autres lecteurs sont protégés du résultat inachevé. Ces deux rôles sont liés mais non identiques — l'atomicité décide si les modifications sont conservées, tandis que la visibilité est régie par l'isolation, le paramètre qui contrôle dans quelle mesure les transactions concurrentes peuvent se voir mutuellement.
